package com.dtx.abstractfactory.listfactory;

import com.dtx.abstractfactory.factory.Item;
import com.dtx.abstractfactory.factory.Tray;

import java.util.Iterator;

/**具体的零件: ListTray类
 * ListTray类是Tray类的子类。这里我们重点看一下makeHTML方法是如何实现的。tray字段中保存了所有需要以HTML格式输出的Item,
 * 而负责将它们以HTML格式输出的就是makeHTML方法了。那么该方法究竟是如何实现的?
 * makeHTML方法首先使用<li>标签输出标题(caption),接着使用<ul>和<li>标签输出每个Item。输出的结果先暂时保存在StringBuffer中,
 * 最后再通过toString方法将输出结果转换为String类型并返回给调用者。
 * 那么,每个Item又是如何输出为HTML格式的呢?当然就是调用每个Item的makeHTML方法了。
 * 请注意,这里并不关心变量Item中保存的实例究竟是ListLink的实例还是ListTray的实例,只是简单地调用item.makeHTML()语句而已。
 * 这里不能使用switch语句或if语句去判断变量item中保存的实例的类型,否则就是非面向对象编程了。变量item是Item类的子类,
 * 因此可以放心地调用。之后item会帮我们进行处理。至于item究竟进行了什么样的处理,只有item的实例(对象)才知道。这就是面向对象的优点。
 * 这里使用的java.util.Iterator类与我们在Iterator模式一章中所学习的迭代器在功能上是相同的,不过它是Java类库自带的。
 * 为了从java.util.ArrayList中得到java.util.Iterator,我们调用iterator方法。
 */
public class ListTray extends Tray {

    public ListTray(String caption) {
        super(caption);
    }

    @Override
    public String makeHTML() {

        StringBuffer buffer = new StringBuffer();

        buffer.append("<li>\n");

        buffer.append(caption + "\n");

        buffer.append("<ul>\n");

        Iterator<Object> it = tray.iterator();

        while (it.hasNext()) {
            Item item = (Item) it.next();
            buffer.append(item.makeHTML());
        }

        buffer.append("</ul>\n");

        buffer.append("</li>\n");

        return buffer.toString();
    }
}
